import type { ColumnType, TableProps } from 'antd/es/table';
import type { InputProps } from 'antd';
import type { FormInstance, FormItemProps } from 'antd/lib/form';
import type { SketchPickerProps } from '@chenshuai2144/sketch-color';
import type {
  AvatarProps,
  CascaderProps,
  CheckboxProps,
  DatePickerProps,
  ImageProps,
  InputNumberProps,
  PopoverProps,
  ProgressProps,
  RadioProps,
  RateProps,
  SegmentedProps,
  SelectProps,
  SliderSingleProps,
  SwitchProps,
  TimeRangePickerProps,
  TreeSelectProps,
} from 'antd';
import type { RangePickerProps } from 'antd/lib/date-picker';
import type { PasswordProps, TextAreaProps } from 'antd/lib/input';
import type { SliderRangeProps } from 'antd/lib/slider';
/**
 * ProFieldValueTypeWithFieldProps
 */
export type ProFieldValueTypeWithFieldProps = {
  /** 文本输入框 */
  text: InputProps;
  /** 密码输入框 */
  password: PasswordProps;
  /** 金额 */
  money: Record<string, any>;
  /** 索引 */
  index: Record<string, any>;
  /** 索引带边框 */
  indexBorder: Record<string, any>;
  /** 下拉选择 */
  option: Record<string, any>;
  /** 多行文本 */
  textarea: TextAreaProps;
  /** 日期选择器 */
  date: DatePickerProps;
  /** 周选择器 */
  dateWeek: DatePickerProps;
  /** 月选择器 */
  dateMonth: DatePickerProps;
  /** 季度选择器 */
  dateQuarter: DatePickerProps;
  /** 年选择器 */
  dateYear: DatePickerProps;
  /** 日期时间选择器 */
  dateTime: DatePickerProps;
  /** 相对时间 */
  fromNow: DatePickerProps;
  /** 日期范围选择器 */
  dateRange: RangePickerProps;
  /** 日期时间范围选择器 */
  dateTimeRange: RangePickerProps;
  /** 周范围选择器 */
  dateWeekRange: RangePickerProps;
  /** 月范围选择器 */
  dateMonthRange: RangePickerProps;
  /** 季范围选择器 */
  dateQuarterRange: RangePickerProps;
  /** 年范围选择器 */
  dateYearRange: RangePickerProps;
  /** 时间选择器 */
  time: TimeRangePickerProps;
  /** 时间范围选择器 */
  timeRange: TimeRangePickerProps;
  /** 下拉选择器 */
  select: SelectProps;
  /** 复选框 */
  checkbox: CheckboxProps;
  /** 评分 */
  rate: RateProps;
  /** 滑动条 */
  slider: SliderSingleProps | SliderRangeProps;
  /** 单选框 */
  radio: RadioProps;
  /** 单选框按钮 */
  radioButton: RadioProps;
  /** 进度条 */
  progress: ProgressProps;
  /** 百分比输入框 */
  percent: InputNumberProps;
  /** 数字输入框 */
  digit: InputNumberProps;
  /** 数字范围输入框 */
  digitRange: InputNumberProps;
  /** 秒数输入框 */
  second: InputNumberProps;
  /** 代码输入框 */
  code: InputProps | TextAreaProps;
  /** JSON 代码输入框 */
  jsonCode: InputProps | TextAreaProps;
  /** 头像 */
  avatar: AvatarProps;
  /** 开关 */
  switch: SwitchProps;
  /** 图片 */
  image: ImageProps | InputProps;
  /** 级联选择 */
  cascader: CascaderProps<any>;
  /** 树形选择 */
  treeSelect: TreeSelectProps;
  /** 颜色选择器 */
  color: SketchPickerProps & {
    value?: string;
    popoverProps?: PopoverProps;
    mode?: 'read' | 'edit';
    // eslint-disable-next-line no-unused-vars
    onChange?: (color: string) => void;
    colors?: string[];
  };
  /** 分段器 */
  segmented: SegmentedProps;
  /** 分组 */
  group: any;
  /** 表单列表 */
  formList: any;
  /** 表单集合 */
  formSet: any;
  /** 分割线 */
  divider: any;
  /** 显示/隐藏 */
  dependency: any;
};
/**
 * @param textarea 文本框
 * @param password 密码框
 * @param money 金额 option 操作 需要返回一个数组
 * @param date 日期 YYYY-MM-DD
 * @param dateWeek 周选择器
 * @param dateMonth 月选择器
 * @param dateQuarter 季度选择器
 * @param dateYear 年选择器
 * @param dateRange 日期范围 YYYY-MM-DD[]
 * @param dateTime 日期和时间 YYYY-MM-DD HH:mm:ss
 * @param dateTimeRange 范围日期和时间 YYYY-MM-DD HH:mm:ss[]
 * @param time: 时间 HH:mm:ss
 * @param timeRange: 时间区间 HH:mm:ss[]
 * @param index：序列
 * @param indexBorder：序列
 * @param progress: 进度条
 * @param percent: 百分比
 * @param digit 数值
 * @param second 秒速
 * @param fromNow 相对于当前时间
 * @param avatar 头像
 * @param code 代码块
 * @param image 图片设置
 * @param jsonCode Json 的代码块，格式化了一下
 * @param color 颜色选择器
 * @param color 颜色选择器
 */

export type ValueType = Extract<keyof ProFieldValueTypeWithFieldProps, any>;

//定义Column接口
interface TableColumn<T> extends ColumnType<T> {
  valueType?: ValueType | 'option';
  hideInTable?: boolean;
  hideInSearch?: boolean;
  isColumnFilter?: boolean;
  mainSearch?: boolean;
  // eslint-disable-next-line no-unused-vars
  renderFormItem?: (item: ColumnType<T>, form: formRef) => React.ReactNode;
  formItemProps?: FormItemProps;
  initialValue?: any;
  copyable?: boolean;
  // eslint-disable-next-line no-unused-vars
  search?: false | { transform: (value: any) => any };
}
export type ProColumnsType<T> = ColumnType<T> & TableColumn<T>[];
//定义Request返回值
export interface ProTableRequestData<T> {
  total: number;
  data: T[];
}
// eslint-disable-next-line no-unused-vars
export type ProTableRequest<T> = (
  // eslint-disable-next-line no-unused-vars
  params: {
    pageSize: number | undefined;
    current: number | undefined;
    [key: string]: any;
  },
  // eslint-disable-next-line no-unused-vars
  filters: any,
  // eslint-disable-next-line no-unused-vars
  sorter: any
) => Promise<ProTableRequestData<T>>;

//定义搜索配置
export interface SearchConfig {
  searchText?: string;
  resetText?: string;
  labelWidth?: string;
  span?: number;
  className?: string;
  // eslint-disable-next-line no-unused-vars
  operateRender?: (ref: formRef) => React.ReactNode[] | false;
  // eslint-disable-next-line no-unused-vars
  moreOperateRender?: (ref: formRef) => React.ReactNode[] | false;
}
//定义搜索的ref

export type formRef = FormInstance;
export interface SearchRef {
  handleFormReset: () => void;
  handleFormSubmit: () => void;
  form: formRef;
}

export interface ProTablRef {
  reload: () => void;
  searchRef: SearchRef;
}

//定义props接口
export interface ProTableProps<T>
  extends Pick<
    TableProps<T>,
    | 'rowKey'
    | 'bordered'
    | 'expandable'
    | 'footer'
    | 'getPopupContainer'
    | 'locale'
    | 'pagination'
    | 'rowClassName'
    | 'rowSelection'
    | 'scroll'
    | 'showHeader'
    | 'sortDirections'
    | 'sticky'
    | 'summary'
    | 'onRow'
    | 'onHeaderRow'
    | 'onChange'
  > {
  // eslint-disable-next-line no-unused-vars
  toolBarRender?: () => React.ReactNode[];
  headerTitle?: string | (() => React.ReactNode);
  columns: ProColumnsType<T>;
  search?: false | SearchConfig;
  // eslint-disable-next-line no-unused-vars
  onSearch?: (value: string) => void;
  request: ProTableRequest<T>;
}
